package com.example.demo.threadCommunication;

import lombok.SneakyThrows;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * @desc: <br/>
 * @author: Jingbo Hu<br/>
 * @time：2020年07⽉21⽇<br/>
 * @version：v1.0.0<br>
 */
public class CyclicBarrierDemo {

    /**
     * 因为主线程和子线程的调度是由CPU决定的，两个线程都有可能先执行，所以会产生两种输出， 1 2 或 2 1
     * <p>
     * 如果把new CyclicBarrier(2)修改成new CyclicBarrier(3)，则主线程和子线程会永远等待，
     * 因为没有第三个线程执行await方法，即没有第三个线程到达屏障，所以之前到达屏障的两个线程都不会继续执行
     */
    private static CyclicBarrier c = new CyclicBarrier(2);

    public static void main(String[] args) throws BrokenBarrierException, InterruptedException {

        Thread thread = new Thread(new Runnable() {
            @SneakyThrows
            @Override
            public void run() {
                System.out.println(1);
                c.await();
            }
        });

        thread.start();
        c.await();

        System.out.println(2);
    }
}
